home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / bin2snd / binsnd.c < prev    next >
C/C++ Source or Header  |  1994-09-15  |  3KB  |  153 lines

  1. #pragma On(public_var_warnings)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <snd.h>
  6. #include <conio.h>
  7.  
  8. typedef struct
  9. {
  10.     char                name[8];
  11.     unsigned int        id;
  12.     unsigned int        length;
  13.     unsigned int        looppoint;
  14.     unsigned int        looplength;
  15.     unsigned short int    freq;
  16.     unsigned short int    adjust;
  17.     unsigned char        note;
  18.     unsigned char        reserve1;
  19.     unsigned short int    reserve2;
  20.              char        data[0];
  21. } SNDBUF;
  22.  
  23. char SndWork[SndWorkSize] ;
  24. int Freq = 20*0x62;
  25. int Len = 5*20*1024;
  26. int Vol = 127;
  27. char Filename[256]="";
  28.  
  29. int arg( int argc, char *argv[] )
  30. {
  31.     int i;
  32.     char sw, *para;
  33.     
  34.     if ( argc < 2 )
  35.         return 1;
  36.     for ( i=1; i<argc; i++ ) {
  37.         if ( argv[i][0]=='-' || argv[i][0]=='/' ) {
  38.             sw = argv[i][1];
  39.             if ( sw!='\0' && argv[i][2]!='\0' ) {
  40.                 para = argv[i] + 2;
  41.             } else {
  42.                 if ( i<argc ) {
  43.                     i++;
  44.                     para = argv[i];
  45.                 } else {
  46.                     para = NULL;
  47.                 }
  48.             }
  49.             switch ( sw ) {
  50.                 case 'h': case 'H':    case '?':
  51.                     return 'h';
  52.                 case 'v': case 'V':
  53.                     Vol = atoi( para );
  54.                     if ( Vol<1 || 127<Vol ) {
  55.                         printf("\n    ボリュームが不正です.");
  56.                         return 'v';
  57.                     }
  58.                     break;
  59.                 case 'f': case 'F':
  60.                     Freq = atoi( para ) * 0x62;
  61.                     if ( Freq<0 || 20*0x62<Freq ) {
  62.                         printf("\n    周波数が不正です.");
  63.                         return 'f';
  64.                     }
  65.                     break;
  66.                 case 'l': case 'L':
  67.                     Len = atoi( para );
  68.                     if ( Len<0 ) {
  69.                         printf("\n    再生バイト数が不正です.");
  70.                         return 'l';
  71.                     }
  72.                     break;
  73.                 default:
  74.                     printf("\n    不正なパラメーターです.");
  75.                     return 2;
  76.             }
  77.         } else {
  78.             strcpy(Filename,argv[i]);
  79.         }
  80.     }
  81.     if (Filename[0]=='\0') {
  82.         printf("\n   ファイルを指定してください.");
  83.         return 3;
  84.     }
  85.     return 0;
  86. }
  87.  
  88. int main( int argc, char *argv[] )
  89. {
  90.     FILE *fp;
  91.     SNDBUF *buf;
  92.     
  93.     if ( arg(argc,argv)!=0 ) {
  94.         printf("\nバイナリファイルをPCMデータとして鳴らすツール by Ushio");
  95.         printf("\n   Use : run386 binsnd [-f freq] [-l len(byte)] filename\n");
  96.         return 1;
  97.     }
  98.     if ( (fp=fopen(Filename,"rb"))==NULL ) {
  99.         printf("\n   \"%s\" がオープン出来ません.",Filename);
  100.         return 1;
  101.     }
  102.     if ( (buf=(SNDBUF *)malloc(Len+32))==NULL ) {
  103.         printf("\n   メモリが足りません.");
  104.         fclose(fp);
  105.         return 1;
  106.     }
  107.     if ( fread(buf->data, 1, 1, fp)<1 ) { //fread test
  108.         printf("\n   \"%s\" を読み込めません(data).",Filename);
  109.         free(buf);
  110.         fclose(fp);
  111.         return 1;
  112.     }
  113.     fseek(fp, 0, SEEK_SET);
  114.     
  115.     buf->name[0] = '\0';
  116.     buf->id = 0;
  117.     buf->looppoint = 0;
  118.     buf->looplength = 0;
  119.     buf->freq = Freq;
  120.     buf->adjust = 0;
  121.     buf->note = 60;
  122.     
  123.     SND_init(SndWork);
  124.     SND_elevol_mute(0x01);
  125.     SND_pcm_mode_set(1);
  126.     
  127.     printf("freqency %d\n",(int)buf->freq*0x64);
  128.     printf("length %#010x %16u\n",Len,Len);
  129.     printf("offset %#010x %16u\n",0,0);
  130.     while ( (buf->length = fread(buf->data, 1, Len, fp)) > 0 ) {
  131.         SND_pcm_play( 71, buf->note, Vol, (char *)buf );
  132.         
  133.         int s0=48,s1=48;
  134.         while((SND_pcm_status(71)!=0)&&((s0&48)==48)&&((s1&48)==48)&&(!kbhit())){
  135.             SND_joy_in_2(0,&s0);
  136.             SND_joy_in_2(1,&s1);
  137.         }
  138.         SND_pcm_play_stop(71);
  139.         if ( ((s0&48)!=48)||((s1&48)!=48)||kbhit() ) {
  140.             printf("\n再生を中断しました.");
  141.             break;
  142.         }
  143.         long fs = ftell( fp );
  144.         printf("offset %#010x %16u\n",fs,fs);
  145.     }
  146.     SND_elevol_init();
  147.     SND_end();
  148.     free(buf);
  149.     fclose(fp);
  150.     return 0 ;
  151.  
  152. }
  153.